home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 726-750 / 746 / skew / source / skew2.c < prev    next >
C/C++ Source or Header  |  1995-03-18  |  14KB  |  513 lines

  1.  
  2. /*
  3.  *              skew2.c  --  SKEleton Writer, part 2
  4.  */
  5.  
  6. #include <exec/types.h>
  7. #include <stdio.h>
  8. #include <dos/dos.h>
  9. #include <intuition/intuition.h>
  10. #include <libraries/gadtools.h>
  11. #include <libraries/asl.h>
  12. #include <graphics/displayinfo.h>
  13.  
  14. #include "skew.h"
  15.  
  16. BOOL Really_Quit = FALSE;    /* TRUE when positive answer to ReallyQuit? */
  17.  
  18. extern long GlobalError;
  19.  
  20. extern BOOL Writing_Done;    /* TRUE when work was saved and no gadget hit */
  21.  
  22. extern long Display_num;
  23.  
  24. extern struct Window  *Wnd;
  25.  
  26. /* flags for cycle gadgets on display #3 */
  27. extern LONG
  28.     WaitingMode_FLAG, Variables_FLAG, Comments_FLAG, FillIns_FLAG,
  29.     TopArgs_FLAG, TopReturn_FLAG, TestVarScope_FLAG;
  30.  
  31. /* stuff for IDCMPWindow name */
  32. extern char *IDCMP_WIN_BUF, IDCMP_WIN_NAME[];
  33.  
  34. /* stuff for top-level function name */
  35. extern char *TOP_LEVEL_BUF, TOP_LEVEL_NAME[];
  36.  
  37. /* prefix & suffix for the names of generated functions */
  38. extern char *PREFIX_BUF, *SUFFIX_BUF, PREFIX_NAME[], SUFFIX_NAME[];
  39.  
  40. extern char *TEST_VAR_BUF, TEST_VAR_NAME[];
  41.  
  42. extern struct Gadget *GList, *Gadgets[];
  43.  
  44. /* flags related to gadgets & output file */
  45. LONG Flag1  = CLASS_FLAG;                        /* 'Class' is preset */
  46. LONG Flag2A, Flag2B, Flag3;
  47.  
  48. /*  function prototypes  */
  49. VOID HandleIDCMP( VOID );
  50. __regargs static VOID HandleGadgets( USHORT, APTR );
  51. static VOID HandleQuitGad( VOID );
  52. static LONG  HandleOutFile( VOID );
  53. __regargs static BOOL AskYesNo(  char *, char *, char * );
  54. __regargs extern VOID  GenerateCode( BPTR );
  55. __regargs extern LONG MakeDisplay( LONG );
  56.  
  57.  
  58. VOID
  59. HandleIDCMP()
  60. {
  61.     struct  IntuiMessage  *msg;
  62.     ULONG    class;
  63.     USHORT  code;
  64.     APTR    iaddress;
  65.  
  66.     while ( Really_Quit == FALSE ) {
  67.         WaitPort( Wnd->UserPort );
  68.  
  69.         while ( msg = (struct IntuiMessage *)GT_GetIMsg( Wnd->UserPort ) ) {
  70.  
  71.         class     = msg->Class;
  72.         code     = msg->Code;
  73.         iaddress = msg->IAddress;
  74.  
  75.         GT_ReplyIMsg( msg );
  76.  
  77.         switch ( class ) {
  78.             case IDCMP_REFRESHWINDOW:
  79.                 GT_BeginRefresh( Wnd );
  80.                 GT_EndRefresh( Wnd, TRUE );
  81.                 break;
  82.             case IDCMP_GADGETUP:
  83.                 HandleGadgets( code, iaddress );
  84.                 break;
  85.             case IDCMP_MENUPICK:
  86.                                             /* just swallow */
  87.                 break;
  88.             }
  89.         }
  90.     }
  91.  
  92.     /* reply all outstanding messages */
  93.     while ( msg = (struct IntuiMessage *)GT_GetIMsg( Wnd->UserPort ) )
  94.         GT_ReplyIMsg( msg );
  95. }
  96.  
  97.  
  98. VOID
  99. HandleGadgets( USHORT code, APTR gad_address )
  100. {
  101.     switch ( Display_num ) {
  102.  
  103.         /* window #0 */
  104.         case 0 :
  105.             if ( gad_address == Gadgets[ GD_IDCMPWindow ] ) {
  106.                 strcpy( IDCMP_WIN_NAME,
  107.   ((struct StringInfo *) Gadgets[ GD_IDCMPWindow ]->SpecialInfo)->Buffer );
  108.  
  109.             }
  110.             else if( gad_address == Gadgets[ GD_Class ] ) {
  111.                 Flag1 ^= CLASS_FLAG;
  112.             }
  113.             else if( gad_address == Gadgets[ GD_Code ] ) {
  114.                 Flag1 ^= CODE_FLAG;
  115.             }
  116.             else if( gad_address == Gadgets[ GD_Qualifier ] ) {
  117.                 Flag1 ^= QUALIFIER_FLAG;
  118.             }
  119.             else if( gad_address == Gadgets[ GD_MouseX ] ) {
  120.                 Flag1 ^= MOUSEX_FLAG;
  121.             }
  122.             else if( gad_address == Gadgets[ GD_MouseY ] ) {
  123.                 Flag1 ^= MOUSEY_FLAG;
  124.             }
  125.             else if( gad_address == Gadgets[ GD_Seconds ] ) {
  126.                 Flag1 ^= SECONDS_FLAG;
  127.             }
  128.             else if( gad_address == Gadgets[ GD_Micros ] ) {
  129.                 Flag1 ^= MICROS_FLAG;
  130.             }
  131.             else if( gad_address == Gadgets[ GD_IAddress ] ) {
  132.                 Flag1 ^= IADDRESS_FLAG;
  133.             }
  134.             else if ( gad_address == Gadgets[ GD_gadtools ] ) {
  135.                 Flag1 ^= gadtools_FLAG;
  136.             }
  137.             else if( gad_address == Gadgets[ GD_QUIT1 ] ) {
  138.                 HandleQuitGad( );
  139.             }
  140.             else if ( gad_address == Gadgets[ GD_GO_ON1 ] ) {
  141.                 RemoveGList( Wnd, GList, -1 );
  142.  
  143.                 /* nothing else works! */
  144.                 ZipWindow( Wnd ); ZipWindow( Wnd );
  145.                 MakeDisplay( ++Display_num );
  146.             }
  147.         break;
  148.  
  149.         /* window #1 */
  150.         case 1 :
  151.             if ( gad_address == Gadgets[ GD_MOUSEBUTTONS ]  ) {
  152.                 Flag2A ^= MOUSEBUTTONS_FLAG;
  153.             }
  154.             else if ( gad_address == Gadgets[ GD_MOUSEBUTTONS_F ] ) {
  155.                 Flag2A ^= MOUSEBUTTONS_F_FLAG;
  156.             }
  157.             else if ( gad_address == Gadgets[ GD_MOUSEMOVE ] ) {
  158.                 Flag2A ^= MOUSEMOVE_FLAG;
  159.             }
  160.             else if ( gad_address == Gadgets[ GD_MOUSEMOVE_F ] ) {
  161.                 Flag2A ^= MOUSEMOVE_F_FLAG;
  162.             }
  163.  
  164.             /* DELTAMOVE is disabled! */
  165.  
  166.             else if ( gad_address == Gadgets[ GD_GADGETDOWN ] ) {
  167.                 Flag2A ^= GADGETDOWN_FLAG;
  168.             }
  169.             else if ( gad_address == Gadgets[ GD_GADGETDOWN_F ] ) {
  170.                 Flag2A ^= GADGETDOWN_F_FLAG;
  171.             }
  172.             else if ( gad_address == Gadgets[ GD_GADGETUP ] ) {
  173.                 Flag2A ^= GADGETUP_FLAG;
  174.             }
  175.             else if ( gad_address == Gadgets[ GD_GADGETUP_F ] ) {
  176.                 Flag2A ^= GADGETUP_F_FLAG;
  177.             }
  178.             else if ( gad_address == Gadgets[ GD_CLOSEWINDOW ] ) {
  179.                 Flag2A ^= CLOSEWINDOW_FLAG;
  180.             }
  181.             else if ( gad_address == Gadgets[ GD_CLOSEWINDOW_F ] ) {
  182.                 Flag2A ^= CLOSEWINDOW_F_FLAG;
  183.             }
  184.             else if ( gad_address == Gadgets[ GD_MENUPICK ] ) {
  185.                 Flag2A ^= MENUPICK_FLAG;
  186.             }
  187.             else if ( gad_address == Gadgets[ GD_MENUPICK_F ] ) {
  188.                 Flag2A ^= MENUPICK_F_FLAG;
  189.             }
  190.             else if ( gad_address == Gadgets[ GD_MENUVERIFY ] ) {
  191.                 Flag2A ^= MENUVERIFY_FLAG;
  192.             }
  193.             else if ( gad_address == Gadgets[ GD_MENUVERIFY_F ] ) {
  194.                 Flag2A ^= MENUVERIFY_F_FLAG;
  195.             }
  196.             else if ( gad_address == Gadgets[ GD_MENUHELP ] ) {
  197.                 Flag2A ^= MENUHELP_FLAG;
  198.             }
  199.             else if ( gad_address == Gadgets[ GD_MENUHELP_F ] ) {
  200.                 Flag2A ^= MENUHELP_F_FLAG;
  201.             }
  202.             else if ( gad_address == Gadgets[ GD_RAWKEY ] ) {
  203.                 Flag2A ^= RAWKEY_FLAG;
  204.             }
  205.             else if ( gad_address == Gadgets[ GD_RAWKEY_F ] ) {
  206.                 Flag2A ^= RAWKEY_F_FLAG;
  207.             }
  208.             else if ( gad_address == Gadgets[ GD_VANILLAKEY ] ) {
  209.                 Flag2A ^= VANILLAKEY_FLAG;
  210.             }
  211.             else if ( gad_address == Gadgets[ GD_VANILLAKEY_F ] ) {
  212.                 Flag2A ^= VANILLAKEY_F_FLAG;
  213.             }
  214.             else if ( gad_address == Gadgets[ GD_REQSET ] ) {
  215.                 Flag2A ^= REQSET_FLAG;
  216.             }
  217.             else if ( gad_address == Gadgets[ GD_REQSET_F ] ) {
  218.                 Flag2A ^= REQSET_F_FLAG;
  219.             }
  220.             else if ( gad_address == Gadgets[ GD_REQCLEAR ] ) {
  221.                 Flag2A ^= REQCLEAR_FLAG;
  222.             }
  223.             else if ( gad_address == Gadgets[ GD_REQCLEAR_F ] ) {
  224.                 Flag2A ^= REQCLEAR_F_FLAG;
  225.             }
  226.             else if ( gad_address == Gadgets[ GD_REQVERIFY ] ) {
  227.                 Flag2A ^= REQVERIFY_FLAG;
  228.             }
  229.             else if ( gad_address == Gadgets[ GD_REQVERIFY_F ] ) {
  230.                 Flag2A ^= REQVERIFY_F_FLAG;
  231.             }
  232.             else if ( gad_address == Gadgets[ GD_NEWSIZE ] ) {
  233.                 Flag2B ^= NEWSIZE_FLAG;
  234.             }
  235.             else if ( gad_address == Gadgets[ GD_NEWSIZE_F ] ) {
  236.                 Flag2B ^= NEWSIZE_F_FLAG;
  237.             }
  238.             else if ( gad_address == Gadgets[ GD_SIZEVERIFY ] ) {
  239.                 Flag2B ^= SIZEVERIFY_FLAG;
  240.             }
  241.             else if ( gad_address == Gadgets[ GD_SIZEVERIFY_F ] ) {
  242.                 Flag2B ^= SIZEVERIFY_F_FLAG;
  243.             }
  244.             else if ( gad_address == Gadgets[ GD_ACTIVEWINDOW ] ) {
  245.                 Flag2B ^= ACTIVEWINDOW_FLAG;
  246.             }
  247.             else if ( gad_address == Gadgets[ GD_ACTIVEWINDOW_F ] ) {
  248.                 Flag2B ^= ACTIVEWINDOW_F_FLAG;
  249.             }
  250.             else if ( gad_address == Gadgets[ GD_INACTIVEWINDOW ] ) {
  251.                 Flag2B ^= INACTIVEWINDOW_FLAG;
  252.             }
  253.             else if ( gad_address == Gadgets[ GD_INACTIVEWINDOW_F ] ) {
  254.                 Flag2B ^= INACTIVEWINDOW_F_FLAG;
  255.             }
  256.             else if ( gad_address == Gadgets[ GD_CHANGEWINDOW ] ) {
  257.                 Flag2B ^= CHANGEWINDOW_FLAG;
  258.             }
  259.             else if ( gad_address == Gadgets[ GD_CHANGEWINDOW_F ] ) {
  260.                 Flag2B ^= CHANGEWINDOW_F_FLAG;
  261.             }
  262.             else if ( gad_address == Gadgets[ GD_REFRESHWINDOW ] ) {
  263.                 Flag2B ^= REFRESHWINDOW_FLAG;
  264.             }
  265.             else if ( gad_address == Gadgets[ GD_REFRESHWINDOW_F ] ) {
  266.                 Flag2B ^= REFRESHWINDOW_F_FLAG;
  267.             }
  268.             else if ( gad_address == Gadgets[ GD_DISKINSERTED ] ) {
  269.                 Flag2B ^= DISKINSERTED_FLAG;
  270.             }
  271.             else if ( gad_address == Gadgets[ GD_DISKINSERTED_F ] ) {
  272.                 Flag2B ^= DISKINSERTED_F_FLAG;
  273.             }
  274.             else if ( gad_address == Gadgets[ GD_DISKREMOVED ] ) {
  275.                 Flag2B ^= DISKREMOVED_FLAG;
  276.             }
  277.             else if ( gad_address == Gadgets[ GD_DISKREMOVED_F ] ) {
  278.                 Flag2B ^= DISKREMOVED_F_FLAG;
  279.             }
  280.             else if ( gad_address == Gadgets[ GD_NEWPREFS ] ) {
  281.                 Flag2B ^= NEWPREFS_FLAG;
  282.             }
  283.             else if ( gad_address == Gadgets[ GD_NEWPREFS_F ] ) {
  284.                 Flag2B ^= NEWPREFS_F_FLAG;
  285.             }
  286.             else if ( gad_address == Gadgets[ GD_INTUITICKS ] ) {
  287.                 Flag2B ^= INTUITICKS_FLAG;
  288.             }
  289.             else if ( gad_address == Gadgets[ GD_INTUITICKS_F ] ) {
  290.                 Flag2B ^= INTUITICKS_F_FLAG;
  291.             }
  292.             else if ( gad_address == Gadgets[ GD_IDCMPUPDATE ] ) {
  293.                 Flag2B ^= IDCMPUPDATE_FLAG;
  294.             }
  295.             else if ( gad_address == Gadgets[ GD_IDCMPUPDATE_F ] ) {
  296.                 Flag2B ^= IDCMPUPDATE_F_FLAG;
  297.             }
  298.             else if ( gad_address == Gadgets[ GD_LONELYMESSAGE ] ) {
  299.                 Flag2B ^= LONELYMESSAGE_FLAG;
  300.             }
  301.             else if ( gad_address == Gadgets[ GD_LONELYMESSAGE_F ] ) {
  302.                 Flag2B ^= LONELYMESSAGE_F_FLAG;
  303.             }
  304.             else if ( gad_address == Gadgets[ GD_QUIT2 ] ) {
  305.                 HandleQuitGad( );
  306.             }
  307.             else if ( gad_address == Gadgets[ GD_GO_ON2 ] ) {
  308.                 RemoveGList( Wnd, GList, -1 );
  309.                 ZipWindow( Wnd ); ZipWindow( Wnd );
  310.                 MakeDisplay( ++Display_num );
  311.             }
  312.             else if ( gad_address == Gadgets[ GD_STEP_BACK2 ] ) {
  313.                 RemoveGList( Wnd, GList, -1 );
  314.                 ZipWindow( Wnd ); ZipWindow( Wnd );
  315.                 MakeDisplay( --Display_num );
  316.             }
  317.         break;
  318.  
  319.         /* window #2 */
  320.         case 2 :
  321.             if ( gad_address == Gadgets[ GD_TopLevelRet ] ) {
  322.                 Writing_Done = FALSE;
  323.                 TopReturn_FLAG = (WaitingMode_FLAG + code) % 2;
  324.             }
  325.             else if ( gad_address == Gadgets[ GD_TopLevelName ] ) {
  326.                 Writing_Done = FALSE;
  327.                 strcpy( TOP_LEVEL_NAME,
  328.   ((struct StringInfo *) Gadgets[ GD_TopLevelName ]->SpecialInfo)->Buffer );
  329.             }
  330.             else if ( gad_address == Gadgets[ GD_Prefix ] ) {
  331.                 Writing_Done = FALSE;
  332.                 strcpy( PREFIX_NAME,
  333.   ((struct StringInfo *) Gadgets[ GD_Prefix ]->SpecialInfo)->Buffer );
  334.             }
  335.             else if ( gad_address == Gadgets[ GD_Suffix ] ) {
  336.                 Writing_Done = FALSE;
  337.                 strcpy( SUFFIX_NAME,
  338.   ((struct StringInfo *) Gadgets[ GD_Suffix ]->SpecialInfo)->Buffer );
  339.             }
  340.             else if ( gad_address == Gadgets[ GD_Skeletons ] ) {
  341.                 Writing_Done = FALSE;
  342.                 Flag3 ^= Skeletons_FLAG;
  343.             }
  344.             else if ( gad_address == Gadgets[ GD_Prototypes ] ) {
  345.                 Writing_Done = FALSE;
  346.                 Flag3 ^= Prototypes_FLAG;
  347.             }
  348.             else if ( gad_address == Gadgets[ GD_WaitingMode ] ) {
  349.                 Writing_Done = FALSE;
  350.                 WaitingMode_FLAG = (WaitingMode_FLAG + code) % 2;
  351.             }
  352.             else if ( gad_address == Gadgets[ GD_Variables ] ) {
  353.                 Variables_FLAG = (Variables_FLAG + code) % 2;
  354.                 Writing_Done = FALSE;
  355.             }
  356.             else if ( gad_address == Gadgets[ GD_Comments ] ) {
  357.                 Writing_Done = FALSE;
  358.                 Comments_FLAG = (Comments_FLAG + code) % 3;
  359.             }
  360.             else if ( gad_address == Gadgets[ GD_FillIns ] ) {
  361.                 Writing_Done = FALSE;
  362.                 FillIns_FLAG = (FillIns_FLAG + code) % 4;
  363.             }
  364.             else if ( gad_address == Gadgets[ GD_TopArgs ] ) {
  365.                 Writing_Done = FALSE;
  366.                 TopArgs_FLAG = (TopArgs_FLAG + code) % 2;
  367.             }
  368.             else if ( gad_address == Gadgets[ GD_TestVarName ] ) {
  369.                 Writing_Done = FALSE;
  370.                 strcpy( TEST_VAR_NAME,
  371.   ((struct StringInfo *) Gadgets[ GD_TestVarName ]->SpecialInfo)->Buffer );
  372.             }
  373.             else if ( gad_address == Gadgets[ GD_TestVarScope ] ) {
  374.                 TestVarScope_FLAG = (TestVarScope_FLAG + code) % 2;
  375.                 Writing_Done = FALSE;
  376.             }
  377.             else if ( gad_address == Gadgets[ GD_QUIT3 ] ) {
  378.                 if ( ! Writing_Done ) {
  379.                     HandleQuitGad();
  380.                 }
  381.                 else {
  382.                     Really_Quit = TRUE;
  383.                 }
  384.             }
  385.             else if ( gad_address == Gadgets[ GD_STEP_BACK3 ] ) {
  386.                 Writing_Done = FALSE;
  387.                 RemoveGList( Wnd, GList, -1 );
  388.                 ZipWindow( Wnd ); ZipWindow( Wnd );
  389.                 MakeDisplay( --Display_num );
  390.             }
  391.             else if( gad_address == Gadgets[ GD_WRITE_C ] ) {
  392.                 if ( ! HandleOutFile() ) {
  393.                     DisplayBeep( NULL );        /* he may try again... */
  394.                     return;
  395.                 }
  396.             }
  397.         break;
  398.     }
  399. }
  400.  
  401.  
  402. VOID
  403. HandleQuitGad()
  404. {
  405.     Really_Quit = AskYesNo( "Do you really want to quit?", " YES ", " NO " );
  406. }
  407.  
  408.  
  409. BOOL
  410. AskYesNo( char *hail_text, char *pos_text, char *neg_text )
  411. {
  412.     struct IntuiText prompt, yprompt, nprompt;
  413.     BOOL return_val;
  414.  
  415.     prompt.FrontPen     = 0;
  416.     prompt.BackPen      = 1;
  417.     prompt.DrawMode     = JAM1;
  418.     prompt.LeftEdge     = 25;
  419.     prompt.TopEdge      = 15;
  420.     prompt.ITextFont    = NULL;
  421.     prompt.IText        = hail_text;
  422.     prompt.NextText     = NULL;
  423.  
  424.     yprompt.FrontPen     = 0;
  425.     yprompt.BackPen      = 1;
  426.     yprompt.DrawMode     = JAM1;
  427.     yprompt.LeftEdge     = 15;
  428.     yprompt.TopEdge      = 3;
  429.     yprompt.ITextFont     = NULL;
  430.     yprompt.IText         = pos_text;
  431.     yprompt.NextText     = NULL;
  432.  
  433.     nprompt.FrontPen     = 0;
  434.     nprompt.BackPen      = 1;
  435.     nprompt.DrawMode     = JAM1;
  436.     nprompt.LeftEdge     = 15;
  437.     nprompt.TopEdge      = 3;
  438.     nprompt.ITextFont     = NULL;
  439.     nprompt.IText         = neg_text;
  440.     nprompt.NextText     = NULL;
  441.  
  442.     return_val = AutoRequest( Wnd, &prompt, &yprompt,
  443.                        &nprompt, NULL, NULL, 120, 80 );
  444. }
  445.  
  446.  
  447. /* returns 0 on SERIOUS error (requester not alocated ); 1 otherwise */
  448. int
  449. HandleOutFile()
  450. {
  451.     char OutFileName[ 80 ];
  452.     char path_str[ 256 ];
  453.     BPTR out_fh = NULL;
  454.     struct FileRequester *gc_GenC = NULL;
  455.  
  456.     struct TagItem    gc_CTags[] = {
  457.         ASL_Hail,               (ULONG)"Save C Source As...",
  458.         ASL_Window,           0L,
  459.         ASL_Height            215,
  460.         ASL_File,            (ULONG)"skew_file.c",
  461.         ASL_Dir,            (ULONG)"RAM:",
  462.         ASL_Pattern,        (ULONG)"#?.c",
  463.         ASL_OKText,            (ULONG)"Save",
  464.         ASL_FuncFlags,      FILF_SAVE | FILF_PATGAD,
  465.         TAG_DONE
  466.     };
  467.  
  468.     if ( ! ( gc_GenC =
  469.         (struct FileRequester *)AllocAslRequest(     ASL_FileRequest,
  470.                                                     TAG_DONE ) ) )
  471.         return( 0 );
  472.  
  473.     gc_CTags[ 1 ].ti_Data = Wnd;
  474.  
  475.     if ( AslRequest( gc_GenC, gc_CTags ) ) {
  476.  
  477.         /* the idiot left us with no file name */
  478.         if ( ! *gc_GenC->rf_File ) {
  479.             AskYesNo( "Can't write to file with NO NAME!",
  480.                     "HOW STUPID OF ME!", "SORRY, I'M SLEEPY..." );
  481.             goto cancel;
  482.         }
  483.  
  484.         strcpy( path_str, gc_GenC->rf_Dir );
  485.         AddPart( path_str, gc_GenC->rf_File, 256 );
  486.  
  487.         /* if we have some file-name and this file already exists */
  488.         if ( ! access( path_str, 0 ) ) {
  489.             if ( ! AskYesNo( "File already exists! Overwrite it?", "YES", "NO" ) ) {
  490.                 goto cancel;             /* he didn't want to overwrite */
  491.             }
  492.         }
  493.     }
  494.     else {
  495.         goto cancel;                    /* user hit 'CANCEL' */
  496.     }
  497.  
  498.     /* this CAN be a slight problem... */
  499.     if ( ( out_fh = Open( path_str, MODE_NEWFILE ) ) == NULL ) {
  500.         AskYesNo( "File has NOT been opened!", "CANCEL", "CANCEL" );
  501.         FreeAslRequest( gc_GenC );
  502.         return( 0 );
  503.     }
  504.  
  505.     GenerateCode( out_fh );
  506.  
  507.     Close( out_fh );
  508.  
  509. cancel:
  510.     FreeAslRequest( gc_GenC );
  511.     return( 1 );
  512. }
  513.